package com.saibo.spider.utils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

public class DateUtils {
	private static final SimpleDateFormat simpleDateFormat_ymd = new SimpleDateFormat("yyyy-MM-dd");
	private static final SimpleDateFormat simpleDateFormat_ymdhms = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	public static final SimpleDateFormat simpleDateFormatymd = new SimpleDateFormat("yyyyMMdd");
	public static final SimpleDateFormat simpleDateFormatymdhms = new SimpleDateFormat("yyyyMMddHHmmss");
	public static final SimpleDateFormat simpleDateFormatymdh = new SimpleDateFormat("yyyyMMddHH");
	public static final SimpleDateFormat simpleDateFormatmdh = new SimpleDateFormat("MM-dd HH");

	/**
	 * 获取某一天的日期（date格式）
	 * 
	 * @param num
	 * @return
	 */
	public static Date getDate(int num) {
		Date date = new Date();// 取时间
		Calendar calendar = new GregorianCalendar();
		calendar.setTime(date);
		calendar.add(Calendar.DATE, num);// 把日期往后增加一天.整数往后推,负数往前移动
		date = calendar.getTime(); // 这个时间就是日期往后推一天的结果
		return date;
	}

	/**
	 * 获取某一天的yyyy-MM-dd日期(string格式)
	 * 
	 * @param num
	 * @return
	 */
	public static String getDateStr_YMD(int num) {
		Date date = new Date();// 取时间
		Calendar calendar = new GregorianCalendar();
		calendar.setTime(date);
		calendar.add(Calendar.DATE, num);// 把日期往后增加一天.整数往后推,负数往前移动
		date = calendar.getTime(); // 这个时间就是日期往后推一天的结果
		return simpleDateFormat_ymd.format(date);
	}

	public static String getDateStrYMD(int num) {
		Date date = new Date();// 取时间
		Calendar calendar = new GregorianCalendar();
		calendar.setTime(date);
		calendar.add(Calendar.DATE, num);// 把日期往后增加一天.整数往后推,负数往前移动
		date = calendar.getTime(); // 这个时间就是日期往后推一天的结果
		return simpleDateFormatymd.format(date);
	}

	public static String getDateStrYMDHMS(int num) {
		Date date = new Date();// 取时间
		Calendar calendar = new GregorianCalendar();
		calendar.setTime(date);
		calendar.add(Calendar.DATE, num);// 把日期往后增加一天.整数往后推,负数往前移动
		date = calendar.getTime(); // 这个时间就是日期往后推一天的结果
		return simpleDateFormatymdhms.format(date);
	}

	public static String getDateStrYMDH(int num) {
		Date date = new Date();// 取时间
		Calendar calendar = new GregorianCalendar();
		calendar.setTime(date);
		calendar.add(Calendar.HOUR, num);// 把日期往后增加一天.整数往后推,负数往前移动
		date = calendar.getTime(); // 这个时间就是日期往后推一天的结果
		return simpleDateFormatymdh.format(date);
	}
	
	public static String getDateStrMDH(int num) {
		Date date = new Date();// 取时间
		Calendar calendar = new GregorianCalendar();
		calendar.setTime(date);
		calendar.add(Calendar.HOUR, num);// 把日期往后增加一天.整数往后推,负数往前移动
		date = calendar.getTime(); // 这个时间就是日期往后推一天的结果
		return simpleDateFormatmdh.format(date);
	}

	public static Date time2Date(long seconds) {
		if (seconds == 0L) {
			return new Date();
		}
		return new Date(seconds);
	}

	public static Date time2DateTime(long seconds) {
		String d = simpleDateFormat_ymdhms.format(seconds);
		System.out.println(d);
		try {
			return simpleDateFormat_ymdhms.parse(d);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return null;
	}

	public static String time2DateStr(long seconds) {
		return simpleDateFormatymd.format(seconds);
	}

	public static Date str2Date_YMDHMS(String str) {
		if (null == str || "".equals(str))
			return getDate(-1);
		try {
			return simpleDateFormat_ymdhms.parse(str);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return getDate(-1);
	}

	@SuppressWarnings("deprecation")
	public static Date str2Date_YMD(String str) {
		if (null == str || "".equals(str))
			return getDate(-1);
		try {
			return simpleDateFormat_ymd.parse(str);
		} catch (ParseException e) {
			String regex = ".*([0-9]{2}[-/][0-9]{2}).*";
			String target = str.replaceAll(regex, "$1");
			Date dateTime = new Date();
			if (target.matches(regex)) {
				String[] year = target.split("-");
				if (Integer.parseInt(year[0]) > (dateTime.getMonth() + 1)) {
					target = (1900 + dateTime.getYear() - 1) + "-" + target + " 00:00:00";
				} else if (Integer.parseInt(year[0]) == (dateTime.getMonth() + 1)) {
					if (Integer.parseInt(year[1]) > dateTime.getDate()) {
						target = (1900 + dateTime.getYear() - 1) + "-" + target + " 00:00:00";
					} else {
						target = (1900 + dateTime.getYear()) + "-" + target + " 00:00:00";
					}
				} else if (Integer.parseInt(year[0]) < (dateTime.getMonth() + 1)) {
					target = (1900 + dateTime.getYear()) + "-" + target + " 00:00:00";
				}
				SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
				Date date;
				try {
					date = simpleDateFormat.parse(target);
					return date;
				} catch (ParseException e1) {
					e1.printStackTrace();
				}
			}
		}
		return getDate(-1);
	}

	/**
	 * 获取日期时间戳
	 * 
	 * @return
	 */
	public static String getDateTime(int num) {
		Date date = new Date();// 取时间
		Calendar calendar = new GregorianCalendar();
		calendar.setTime(date);
		calendar.add(Calendar.DATE, num);// 把日期往后增加一天.整数往后推,负数往前移动
		date = calendar.getTime(); // 这个时间就是日期往后推一天的结果
		try {
			return simpleDateFormat_ymd.parse(simpleDateFormat_ymd.format(date)).getTime() + "";
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return null;
	}

	public static void main(String[] args) {
		System.out.println(time2DateStr(Long.parseLong("20160101")));
	}
}
